# !/usr/bin/env python3
# -*- coding: utf-8 -*-
"""
===========================
@Time : 2022/8/27 0027 23:05
@Author : 测试开发工程师
@File : 4. 工厂设计模式.py
@Software: PyCharm
============================
"""

"""
简介：
    当创建对象的代码多而杂时，可以用工厂模式将对象的创建和使用分离，让代码更加清晰
    生产者  -   消费者
    
分类：
    简单工厂： 把创建大量实例的代码放到工厂类中
    工厂方法： 如果创建实例的代码非常复杂，就可以把创建实例的代码单独放入一个类
    抽象工厂： 分类是多级的，需要创建多个工厂时，工厂类可以实现多个创建方法

"""
# Demo 用于加载不同的文件，对不同的文件作不同的处理
class Demo:
    def load(self,rule):
        parse = None
        # 根据不同的 rule ，创建不同的对象
        if 'xml' == rule:
            parse = XmlParse()
        elif 'json' == rule:
            parse = JsonParse()
        elif 'excel' == rule:
            parse = ExcelParse()
        elif 'csv' == rule:
            parse = CsvParse()
        else:
            parse = OtherParse()
        # 调用对象的方法进行操作
        parse.parse()

# 相当于接口，用于规范各个解析类
# 每个解析类都要实现 parse 方法，否则 在调用的时候就会报错
class IParse:
    def parse(self):
        raise ValueError()

class XmlParse(IParse):
    def parse(self):
        print('XmlParse')

class JsonParse(IParse):
    def parse(self):
        print('JsonParse')

class ExcelParse(IParse):
    def parse(self):
        print('ExcelParse')

class CsvParse(IParse):
    def parse(self):
        print('CsvParse')

class OtherParse(IParse):
    def parse(self):
        print('OtherParse')

if __name__ == '__main__':
    Demo().load('json')